package org.andengine.extension.svg.adt;

import org.andengine.extension.svg.util.SAXHelper;
import org.andengine.extension.svg.util.SVGParserUtils;
import org.andengine.extension.svg.util.constants.ISVGConstants;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.AttributesImpl;


/**
 * @author Larva Labs, LLC
 *         (c) 2010 Nicolas Gramlich
 *         (c) 2011 Zynga Inc.
 * @author Nicolas Gramlich
 * @since 16:49:55 - 21.05.2011
 */
public class SVGAttributes implements ISVGConstants {
    // ===========================================================
    // Constants
    // ===========================================================

    // ===========================================================
    // Fields
    // ===========================================================

    private final Attributes mAttributes;
    private SVGAttributes mParentSVGAttributes;

    // ===========================================================
    // Constructors
    // ===========================================================

    public SVGAttributes(final Attributes pAttributes, final boolean pAttributesDeepCopy) {
        this.mAttributes = (pAttributesDeepCopy) ? new AttributesImpl(pAttributes) : pAttributes;
    }

    public SVGAttributes(final SVGAttributes pParentSVGAttributes, final Attributes pAttributes, final boolean pAttributesDeepCopy) {
        this.mAttributes = (pAttributesDeepCopy) ? new AttributesImpl(pAttributes) : pAttributes;
        this.mParentSVGAttributes = pParentSVGAttributes;
    }

    // ===========================================================
    // Getter & Setter
    // ===========================================================

    public void setParentSVGAttributes(final SVGAttributes pParentSVGAttributes) {
        this.mParentSVGAttributes = pParentSVGAttributes;
    }

    // ===========================================================
    // Methods for/from SuperClass/Interfaces
    // ===========================================================

    // ===========================================================
    // Methods
    // ===========================================================

    public String getStringAttribute(final String pAttributeName, final boolean pAllowParentSVGAttributes, final String pDefaultValue) {
        final String s = this.getStringAttribute(pAttributeName, pAllowParentSVGAttributes);
        if (s == null) {
            return pDefaultValue;
        } else {
            return s;
        }
    }

    public String getStringAttribute(final String pAttributeName, final boolean pAllowParentSVGAttributes) {
        final String s = SAXHelper.getStringAttribute(this.mAttributes, pAttributeName);
        if (s == null && pAllowParentSVGAttributes) {
            if (this.mParentSVGAttributes == null) {
                return null;
            } else {
                return this.mParentSVGAttributes.getStringAttribute(pAttributeName, pAllowParentSVGAttributes);
            }
        } else {
            return s;
        }
    }

    public Float getFloatAttribute(final String pAttributeName, final boolean pAllowParentSVGAttributes) {
        return SVGParserUtils.extractFloatAttribute(this.getStringAttribute(pAttributeName, pAllowParentSVGAttributes));
    }

    public Float getFloatAttribute(final String pAttributeName, final boolean pAllowParentSVGAttributes, final float pDefaultValue) {
        final Float f = this.getFloatAttribute(pAttributeName, pAllowParentSVGAttributes);
        if (f == null) {
            return pDefaultValue;
        } else {
            return f;
        }
    }

    // ===========================================================
    // Inner and Anonymous Classes
    // ===========================================================
}